//
//  CZEmoticonPackageManager.swift
//  53.表情键盘新工程
//
//  Created by gzxzmac on 16/3/31.
//  Copyright © 2016年 gzxzmac. All rights reserved.
//

import UIKit

/// 一页显示20个表情
let CZEmoticonNumberOfPage = 20

/// 一页有7列
let CZEmoticonColumnOfPage = 7

/// 一页有3行
let CZEmoticonRowOfPage = 3

/// 管理所有表情,加载/保存表情包和表情
class CZEmoticonPackageManager: NSObject {
    static let sharedManager = CZEmoticonPackageManager()
    
    private override init() {
        super.init()
    }
    
    // 1.获取Emoticons.bundle的路径
    static let bundlePath = NSBundle.mainBundle().pathForResource("Emoticons.bundle", ofType: nil)!
    
    /// 最近表情归档和解档的路径
    let emoticonsPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last!.stringByAppendingString("/emoticons.plist")
    
    /// 懒加载所有表情包模型
    /// 加载表情包是一个耗时的操作,表情包里面的内容不会改变,只要加载一次就可以了,1.CZEmoticonPackageManager是一个单例 2.属性是懒加载的
    lazy var packages: [CZEmoticonPackageModel] = self.loadPackages()
    
    /// 加载所有的表情包模型
    /// 加载表情包是一个耗时的操作,表情包里面的内容不会改变,只要加载一次就可以了
    private func loadPackages() -> [CZEmoticonPackageModel] {
        var packages = [CZEmoticonPackageModel]()
        
        /// 手动创建最近表情包
        let recentPackage = CZEmoticonPackageModel(id: "", group_name_cn: "最近", emoticons: loadRecentEmoticons())
        packages.append(recentPackage)
        
        /// 加载默认表情包
        packages.append(loadPackage("com.sina.default"))

        /// 加载Emoji表情包
        packages.append(loadPackage("com.apple.emoji"))
        
        /// 加载Lxh表情包
        packages.append(loadPackage("com.sina.lxh"))
        
        return packages
    }
    
    /**
     加载单个表情包模型
     access_token
     - parameter id: 表情包对应的文件夹名称
     */
    private func loadPackage(id: String) -> CZEmoticonPackageModel {
        // 1.获取Emoticons.bundle的路径
//        let bundlePath = NSBundle.mainBundle().pathForResource("Emoticons.bundle", ofType: nil)!
        
        // 2.加载文件夹里面的info.plist = bundlePath/id/info.plist
        let infoPath = CZEmoticonPackageManager.bundlePath + "/" + id + "/" + "info.plist"
        let infoDict = NSDictionary(contentsOfFile: infoPath)!
//        print("infoDict: \(infoDict)")
        
        // 3.解析info.plist
        // 3.1解析group_name_cn
        let group_name_cn = infoDict["group_name_cn"] as! String
        
        // 3.2解析emoticons
        let emoticonsArray = infoDict["emoticons"] as! [[String: String]]
        
        // 定义表情模型数组
        var emoticons = [CZEmoticonModel]()
        // 4.遍历数组,拿出每个字典,转成模型
        for dict in emoticonsArray {
            // 字典转模型,表情模型
            emoticons.append(CZEmoticonModel(id: id, dict: dict))
        }
        
        return CZEmoticonPackageModel(id: id, group_name_cn: group_name_cn, emoticons: emoticons)
    }
    
    /**
     添加最近表情
     
     - parameter emoticon: 要添加的表情模型
     */
    func addFavorate(emoticon: CZEmoticonModel) {
        // 获取到最近这页表情模型数组,数组是值传递,改变recentEmoticons,并不会影响 packages[0].pageEmoticons[0]
        var recentEmoticons = packages[0].pageEmoticons[0]
        
        //获取之前已经存在表情(和传入的表情是重复的)
        let sameEmoticons = recentEmoticons.filter { (e) -> Bool in
            // emoji
            if emoticon.emoji != nil {
                return emoticon.code == e.code
            } else {
                return emoticon.chs == e.chs
            }
        }
        
        // 将重复的表情删除掉
        if let sameEmoticon = sameEmoticons.first {
            // 获取重复表情的位置
            let index = recentEmoticons.indexOf(sameEmoticon)
            recentEmoticons.removeAtIndex(index!)
//            print("有重复表情,删除: \(index), \(sameEmoticon)")
        }
        
        // 添加表情
        recentEmoticons.insert(emoticon, atIndex: 0)
        
        // 判断是否超过20个,如果超过20,将数组最后的表情删除
        while recentEmoticons.count > CZEmoticonNumberOfPage {
            recentEmoticons.removeLast()
        }
        
        // 重新赋值回去
        packages[0].pageEmoticons[0] = recentEmoticons
        
        // 将最近表情里面的表情模型保存起来
        saveRecentEmoticons(packages[0].pageEmoticons[0])
        
//        print("recentEmoticons: \(recentEmoticons)")
//        print("packages[0].pageEmoticons[0]: \(packages[0].pageEmoticons[0])")
    }
    
    /**
     根据表情名称查找表情模型
     
     - parameter name: 表情名称
     
     - returns: 表情模型
     */
    class func emoticonNameToEmoticonModel(name: String) -> CZEmoticonModel? {
        // 去所有的表情包里面找
        for package in CZEmoticonPackageManager.sharedManager.packages {
            for emoticon in package.emoticons {
                if emoticon.chs == name {
                    // 找到了
                    return emoticon
                }
            }
        }
        
        return nil
    }
    
    /**
     将最近表情归档到沙盒
     */
    private func saveRecentEmoticons(emoticons: [CZEmoticonModel]) {
//        print("emoticonsPath: \(emoticonsPath)")
        NSKeyedArchiver.archiveRootObject(emoticons, toFile: emoticonsPath)
    }
    
    /**
     解档最近表情模型数组
     */
    private func loadRecentEmoticons() -> [CZEmoticonModel] {
        if let emoticons = NSKeyedUnarchiver.unarchiveObjectWithFile(emoticonsPath) as? [CZEmoticonModel] {
            // 解档出了对象
            return emoticons
        } else {
            // 没有解档出对象
            return [CZEmoticonModel]()
        }
    }
}
